//package com.sjf.batch.utils;
//
//import lombok.extern.slf4j.Slf4j;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.data.redis.core.StringRedisTemplate;
//import org.springframework.data.redis.core.script.DefaultRedisScript;
//import org.springframework.data.redis.core.script.RedisScript;
//import org.springframework.stereotype.Service;
//
//import java.util.Arrays;
//import java.util.UUID;
//import java.util.concurrent.TimeUnit;
//
//@Slf4j
//@Service
//public class TokenUtilService {
//
//    @Autowired
//    private StringRedisTemplate redisTemplate;
//
//    /**
//     * 存入 Redis 的 Token 键的前缀
//     */
//    private static final String IDEMPOTENT_TOKEN_PREFIX = "idempotent_token:";
//
//    /**
//     * 创建 Token 存入 Redis，并返回该 Token
//     *
//     * @param value 用于辅助验证的 value 值
//     * @return 生成的 Token 串
//     */
//    public String generateToken(String value) {
//        // 实例化生成 ID 工具对象
//        String token = UUID.randomUUID().toString();
//        // 设置存入 Redis 的 Key
//        String key = IDEMPOTENT_TOKEN_PREFIX + token;
//        // 存储 Token 到 Redis，且设置过期时间为5分钟
//        redisTemplate.opsForValue().set(key, value, 5, TimeUnit.MINUTES);
//        // 返回 Token
//        return token;
//    }
//
//    /**
//     * 验证 Token 正确性
//     *
//     * @param token token 字符串
//     * @param value value 存储在Redis中的辅助验证信息
//     * @return 验证结果
//     */
//    public boolean validToken(String token, String value) {
//        // 设置 Lua 脚本，其中 KEYS[1] 是 key，KEYS[2] 是 value
//        String script = "if redis.call('get', KEYS[1]) == KEYS[2] then return redis.call('del', KEYS[1]) else return 0 end";
//        RedisScript<Long> redisScript = new DefaultRedisScript<> (script, Long.class);
//        // 根据 Key 前缀拼接 Key
//        String key = IDEMPOTENT_TOKEN_PREFIX + token;
//        // 执行 Lua 脚本
//        Long result = redisTemplate.execute(redisScript, Arrays.asList(key, value));
//        // 根据返回结果判断是否成功成功匹配并删除 Redis 键值对，若果结果不为空和0，则验证通过
//        if (result != null && result != 0L) {
//            log.info("验证 token={},key={},value={} 成功", token, key, value);
//            return true;
//        }
//        log.info("验证 token={},key={},value={} 失败", token, key, value);
//        return false;
//    }
//
//}